#include"Stack.h"

void StackInit(Stack* st){
     assert(st);
     st->a=NULL;
     st->top=st->capacity=0;
}
void StackDestroy(Stack* st){
    assert(st);
    free(st->a);st->a=NULL;
    st->top=st->capacity=0;
}
void StackPush(Stack* st,DataType x){
  if(st->capacity==st->top){
    int newcapacity=(st->capacity==0?2:st->capacity*2);
    DataType* tmp=(DataType*)realloc(st->a,newcapacity*sizeof(DataType));
    if(tmp==NULL){
        perror("realloc error!\n"); 
        exit(-1);
    }
    st->a=tmp;
    st->capacity=newcapacity;
  }
  st->a[st->top]=x;st->top++;
}
void StackPop(Stack* st){
    assert(st);
    assert(!StackEmpty(st));
    st->top--;
}
bool StackEmpty(Stack* st){
     assert(st);
     return st->top==0;
}
int StackSize(Stack* st){
     assert(st);
     return st->top;
}
DataType StackTop(Stack* st){
     assert(st);
     assert(!StackEmpty(st));
     return st->a[st->top-1];
}
